# _*_ coding: utf-8 _*_
# .@FileName:regex_match
# .@Data....:2025-02-03 : 18 : 28
# .@Aurhor..:LiuJingYu
"""
launch:
   import maya.cmds as cmds
   FileName.main() 
"""
from __future__ import unicode_literals, print_function
import re
import maya.cmds as mc

# def match(exp):
#     """
#     在 Maya 场景中使用正则表达式匹配所有对象名称，返回完全匹配的对象名称。
#
#     参数:
#     exp (str): 用于匹配的正则表达式字符串。
#
#     返回:
#     生成器，逐个返回完全匹配的对象名称。
#     """
#     try:
#         # 编译正则表达式
#         re_o = re.compile(exp)
#         # 遍历 Maya 场景中的所有对象名称
#         for n in mc.ls("*"):
#             # 使用 re.fullmatch 进行全匹配检查
#             if re_o.fullmatch(n):
#                 yield n
#     except re.error as e:
#         # 处理正则表达式语法错误
#         print(f"正则表达式语法错误: {e}")


def match(pattern, case_sensitive=True, exclude_default=True):
    """
    优化版场景对象匹配函数

    参数:
    pattern (str): 正则表达式模式字符串
    match_type (str/list): 要匹配的节点类型，默认transform节点
    case_sensitive (bool): 是否区分大小写，默认True
    exclude_default (bool): 是否排除默认创建的节点，默认True

    返回:
    generator: 生成符合条件且全匹配的对象名称

    异常:
    re.error: 当传入非法正则表达式时抛出
    """
    # 预编译正则表达式（提升性能）
    try:
        flags = 0 if case_sensitive else re.IGNORECASE
        regex = re.compile(pattern, flags)
    except re.error as e:
        raise re.error(f"无效的正则表达式 '{pattern}': {e}") from None

    # 获取场景对象列表（带类型过滤）
    try:
        # 开启undo chunk保证操作原子性
        mc.undoInfo(openChunk=True)
        nodes = mc.ls("*", long=False) or []
    finally:
        mc.undoInfo(closeChunk=True)

    # 预定义需要排除的默认节点集合
    default_nodes = {
        "persp", "top", "front", "side",
        "lightSet", "defaultLightSet",
        "defaultObjectSet", "initialShadingGroup"
    } if exclude_default else set()

    # 使用生成器表达式逐项处理（内存友好）
    for node in nodes:
        # 跳过默认节点
        if node in default_nodes:
            continue

        # 排除引用节点
        if mc.referenceQuery(node, isNodeReferenced=True):
            continue

        # 执行正则全匹配
        if regex.fullmatch(node):
            yield node